<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <script>
    /*
    1、浅拷贝
    浅拷贝只复制某个对象的引用，而不复制对象本身，新旧对象还是共享同一块内存
      Object.assign()
    2、深拷贝
    深拷贝会创造一个一摸一样的对象，新对象和原对象不共享内存，修改新对象不会改变原对对象。
      let newObj = JSON.parse(JSON.stringify(obj));
    缺点：

    1) 如果对象有函数，函数无法被拷贝下来

    2)无法拷贝对象原型链上的属性和方法

    3)当数据的层次很深，会栈溢出


    */



    //浅拷贝->仅仅指向复制的内存地址，如果原地址发送改变，那么浅拷贝处理的对象也会变
    //新旧对象共享内存,修改其中一个，另一个也会受到影响
    //深拷贝->不会影响,重新开辟新内存,不会影响旧数据

    let obj = {
      name: '张三',
      age: 18
    }
    let obj2 = obj
    obj.name = '李四'
    console.log(`obj`, obj);
    console.log(`obj2`, obj2);
    let obj3 = Object.assign(obj)
    console.log(`obj3`, obj3);
    //深拷贝
    //1.通过JSON对象实现深拷贝
    /*
      1.JSON.stringify->将js值(数组或对象)转为JSON字符串
      2.JSON.parse->用来解析JSON字符串，转换为Object类型
    */
    let a = {
      name: '张三',
      age: 18,
      fn: () => {
        console.log(123);
      }
    }
    let a2 = JSON.parse(JSON.stringify(a))
    a.name = '海贼王'
    console.log(`a`, a);
    console.log(`a2`, a2);//没有函数
    let a3 = { ...a }
    console.log(`a3`, a3);//浅拷贝有函数


  </script>
</body>

</html>